home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-01 | 4.0 KB | 185 lines | [TEXT/CWIE] |
- // TrapsGen - generate a C table from <traps.h>.
- // Written by Chris K. Thomas.
- // Yes, this is awful. But it only took five minutes to write.
-
- #include <LHandleStream.h>
- #include <UException.h>
- #include <LFile.h>
- #include "StFile.h"
- #include "DebugNum.h"
-
- /* Globals */
-
- /* Prototypes */
- void Initialize(void);
- void InsertTextIntoStream(short inID, LStream &inStream);
- long SearchForChar(char inChar, long inStartPos, Ptr inBuffer, long inBufferLen);
- void TrapsConvert();
-
- void main(void)
- {
- Initialize();
- }
-
- void Initialize(void)
- {
- OSErr error;
- SysEnvRec theWorld;
-
- error = SysEnvirons(1, &theWorld);
- if (theWorld.hasColorQD == false) {
- SysBeep(50);
- ExitToShell(); /* If no color QD, we must leave. */
- }
-
- /* Initialize all the needed managers. */
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- Try_
- {
- TrapsConvert();
- }
- Catch_(inErr)
- {
- DebugNum(inErr);
- }
- EndCatch_
- }
-
- char delimiter = '\0';
-
- void TrapsConvert()
- {
- LHandleStream outTrapsTable;
- Handle trapData;
-
- // setup header
- InsertTextIntoStream(128, outTrapsTable);
- InsertTextIntoStream(129, outTrapsTable);
- InsertTextIntoStream(130, outTrapsTable);
-
- FSSpec theTrapsSpec;
- FSMakeFSSpec(0, 0, "\pTraps.h", &theTrapsSpec);
-
- // get data from traps.h
- {
- LFile ourFile(theTrapsSpec);
-
- ourFile.OpenDataFork(fsRdPerm);
- trapData = ourFile.ReadDataFork();
- ourFile.CloseDataFork();
- }
-
- HLockHi(trapData);
- Ptr trapDataPtr = *trapData;
- long bufferSize = GetHandleSize(trapData);
- long pos = 0;
- long numTraps = 0;
- long startName, endName, startNum, endNum;
- Str255 str;
-
- for(;;)
- {
- startName = SearchForChar('_', pos, trapDataPtr, bufferSize);
- if(startName == -1) break;
- pos = startName;
- /*if(trapDataPtr[pos + 1] == '_')
- {
- //ignore preprocessor symbols
- pos+=2;
- continue;
- }*/
-
- endName = SearchForChar('\t', pos, trapDataPtr, bufferSize);
- if(endName == -1) break;
- pos = endName;
-
- startNum = SearchForChar('=', pos, trapDataPtr, bufferSize);
- if(startNum == -1) break;
- startNum++;
- pos = startNum;
-
- delimiter = '\r';
- endNum = SearchForChar(',', pos, trapDataPtr, bufferSize);
- if(endNum == -1)
- endNum = SearchForChar('\r', pos, trapDataPtr, bufferSize);
-
- if(endNum == -1) break;
- pos = endNum;
-
- delimiter = '\0';
-
- InsertTextIntoStream(256, outTrapsTable);
- outTrapsTable.WriteData(&trapDataPtr[startName], endName - startName);
- InsertTextIntoStream(258, outTrapsTable);
- outTrapsTable.WriteData(&trapDataPtr[startNum], endNum - startNum);
- InsertTextIntoStream(257, outTrapsTable);
-
- numTraps += 1;
- }
-
- outTrapsTable.SetMarker(1, streamFrom_End);
- InsertTextIntoStream(131, outTrapsTable);
-
- // append number of traps recorded
- InsertTextIntoStream(300, outTrapsTable);
-
- // NumToString(numTraps, str);
- // DebugStr(str);
-
- outTrapsTable.WriteData(&str[1], str[0]);
-
- InsertTextIntoStream(301, outTrapsTable);
-
- StPutFile ourPutFile("\pSave Traps table as:", "\pSpankingTraps.cp");
- if(ourPutFile.reply.sfGood)
- {
- LFile ourFile(ourPutFile.reply.sfFile);
-
- ourFile.CreateNewDataFile('MPCC', 'TEXT');
- ourFile.OpenDataFork(fsWrPerm);
- ourFile.WriteDataFork(*outTrapsTable.GetDataHandle(), GetHandleSize(outTrapsTable.GetDataHandle()));
- ourFile.CloseDataFork();
- }
- }
-
- long SearchForChar(char inChar, long inStartPos, Ptr inBuffer, long inBufferLen)
- {
- for(long i = inStartPos; i < inBufferLen; i++)
- {
- if(inBuffer[i] == inChar)
- {
- return i;
- }
- else if(inBuffer[i] == delimiter) //optional delimiter
- return -1;
- else if(inBuffer[i] == '#') //ignore preprocessor symbols
- {
- while(inBuffer[i] != '\r') //and the lines they're on
- {
- i++;
- }
- }
- }
-
- return -1;
- }
-
- void InsertTextIntoStream(short inID, LStream &inStream)
- {
- Handle ourResource = GetResource('TEXT', inID);
-
- ThrowIfNULL_(ourResource);
-
- HLockHi(ourResource);
- inStream.WriteData(*ourResource, GetHandleSize(ourResource));
- HUnlock(ourResource);
-
- //purposely don't dispose text - res manager serves as cache mechanism
- }